import { createTool } from '@mastra/core/tools';
import { z } from 'zod';
import { CaseDataSchema, SuspectDataSchema, ClueDataSchema, CaseGenerationRequestSchema } from '../types/game';

/**
 * 案件生成工具
 * 根据难度和主题生成完整的推理案件，包括案件背景、嫌疑人和线索
 */
export const caseGenerationTool = createTool({
  id: 'generate-case',
  description: '生成随机的推理案件，包括案件背景、嫌疑人和初始线索',
  inputSchema: CaseGenerationRequestSchema,
  outputSchema: z.object({
    case: CaseDataSchema,
    suspects: z.array(SuspectDataSchema),
    initialClues: z.array(ClueDataSchema),
  }),
  execute: async ({ context }) => {
    const { difficulty, theme, suspectCount } = context;
    return await generateCaseData(difficulty, theme, suspectCount);
  },
});

/**
 * 生成案件数据的核心逻辑
 * @param difficulty 案件难度等级
 * @param theme 案件主题偏好
 * @param suspectCount 嫌疑人数量
 * @returns 完整的案件数据
 */
async function generateCaseData(
  difficulty: 'easy' | 'normal' | 'hard',
  theme?: string,
  suspectCount: number = 3
) {
  const caseId = `case-${Date.now()}`;
  
  // 案件模板库 - 根据难度分类
  const caseTemplates = {
    easy: [
      {
        title: '办公室咖啡毒杀案',
        location: '科技公司办公室',
        victim: '张经理',
        weapon: '氰化物',
        timeOfCrime: '上午10:30',
        description: '张经理在办公室喝咖啡后突然倒地身亡，初步检查发现咖啡中含有氰化物',
        motives: ['升职竞争', '商业机密泄露', '个人恩怨'],
        suspectProfiles: [
          { role: '助理', personality: '谨慎内向', background: '新入职员工，渴望证明自己' },
          { role: '同事', personality: '野心勃勃', background: '竞争对手，一直想要张经理的职位' },
          { role: '清洁工', personality: '老实本分', background: '长期员工，知道很多公司秘密' }
        ]
      },
      {
        title: '图书馆密室案',
        location: '大学图书馆古籍室',
        victim: '李教授',
        weapon: '重物击打',
        timeOfCrime: '晚上8:15',
        description: '李教授被发现死在锁闭的古籍室内，头部受到重击，现场无明显打斗痕迹',
        motives: ['学术争议', '研究成果争夺', '师生矛盾'],
        suspectProfiles: [
          { role: '研究生', personality: '聪明但偏执', background: '李教授的学生，论文被质疑抄袭' },
          { role: '同事教授', personality: '温和但固执', background: '与李教授有学术分歧' },
          { role: '图书管理员', personality: '细心谨慎', background: '熟悉图书馆所有角落和时间安排' }
        ]
      }
    ],
    normal: [
      {
        title: '密室电梯谋杀案',
        location: '高档写字楼电梯',
        victim: '王总监',
        weapon: '钢丝勒杀',
        timeOfCrime: '下午3:45',
        description: '王总监被发现死在电梯内，脖子上有钢丝勒痕，电梯监控显示异常',
        motives: ['遗产争夺', '商业欺诈', '情感纠纷'],
        suspectProfiles: [
          { role: '下属', personality: '表面恭敬内心不满', background: '被王总监压制多年，掌握其违法证据' },
          { role: '合作伙伴', personality: '精明狡猾', background: '与王总监有商业纠纷，面临巨额损失' },
          { role: '前妻', personality: '优雅但冷酷', background: '离婚后财产分割不公，心怀怨恨' }
        ]
      },
      {
        title: '酒店房间离奇死亡',
        location: '五星级酒店套房',
        victim: '陈女士',
        weapon: '过敏性休克',
        timeOfCrime: '凌晨2:30',
        description: '陈女士在酒店房间内死于严重过敏反应，房间内发现可疑食物和药物',
        motives: ['保险诈骗', '婚外情暴露', '商业竞争'],
        suspectProfiles: [
          { role: '丈夫', personality: '表面关爱实则冷漠', background: '知道妻子过敏史，最近购买大额保险' },
          { role: '情人', personality: '冲动易怒', background: '与陈女士有不正当关系，被要求分手' },
          { role: '商业对手', personality: '心机深沉', background: '与陈女士公司有激烈竞争，手段不择' }
        ]
      }
    ],
    hard: [
      {
        title: '时间错位杀人案',
        location: '私人别墅',
        victim: '赵先生',
        weapon: '精密机关装置',
        timeOfCrime: '午夜12:00',
        description: '赵先生死于精心设计的机关装置，死亡时间与凶手不在场证明形成矛盾',
        motives: ['复仇计划', '遗产继承', '身份秘密'],
        suspectProfiles: [
          { role: '养子', personality: '聪明但阴郁', background: '机械工程师，被赵先生收养但一直受到冷遇' },
          { role: '管家', personality: '忠诚但隐藏秘密', background: '服务赵家多年，知道所有家族秘密' },
          { role: '商业伙伴', personality: '表面友好实则狡诈', background: '与赵先生有复杂的商业和个人关系' }
        ]
      },
      {
        title: '双重身份谋杀案',
        location: '艺术画廊',
        victim: '孙画家',
        weapon: '毒颜料',
        timeOfCrime: '展览开幕式期间',
        description: '著名画家孙先生在自己的画展开幕式上中毒身亡，使用的毒物混在颜料中',
        motives: ['艺术品造假', '身份暴露', '情感报复'],
        suspectProfiles: [
          { role: '画廊老板', personality: '优雅但贪婪', background: '与孙画家合作造假名画，担心被揭发' },
          { role: '前学生', personality: '才华横溢但偏激', background: '发现老师抄袭自己作品，愤而报复' },
          { role: '艺术评论家', personality: '尖刻毒舌', background: '掌握孙画家的黑暗秘密，进行敲诈' }
        ]
      }
    ]
  };
  
  // 根据主题过滤模板（如果指定了主题）
  let availableTemplates = caseTemplates[difficulty];
  if (theme) {
    availableTemplates = availableTemplates.filter(template => 
      template.title.includes(theme) || template.location.includes(theme)
    );
    // 如果没有匹配的主题，使用默认模板
    if (availableTemplates.length === 0) {
      availableTemplates = caseTemplates[difficulty];
    }
  }
  
  // 随机选择模板
  const template = availableTemplates[Math.floor(Math.random() * availableTemplates.length)];
  
  // 随机选择真凶
  const culpritIndex = Math.floor(Math.random() * Math.min(suspectCount, template.suspectProfiles.length));
  const culpritId = `suspect-${culpritIndex + 1}`;
  
  // 生成案件基本信息
  const caseData = {
    id: caseId,
    title: template.title,
    description: template.description,
    location: template.location,
    timeOfCrime: template.timeOfCrime,
    victim: template.victim,
    murderWeapon: template.weapon,
    motive: template.motives[Math.floor(Math.random() * template.motives.length)],
    culpritId,
    difficulty,
    createdAt: new Date().toISOString(),
  };
  
  // 生成嫌疑人
  const suspects = generateSuspects(caseId, suspectCount, culpritId, template);
  
  // 生成初始线索
  const initialClues = generateInitialClues(caseId, suspects, difficulty, template);
  
  return {
    case: caseData,
    suspects,
    initialClues,
  };
}

/**
 * 生成嫌疑人信息
 * @param caseId 案件ID
 * @param count 嫌疑人数量
 * @param culpritId 真凶ID
 * @param template 案件模板
 * @returns 嫌疑人列表
 */
function generateSuspects(caseId: string, count: number, culpritId: string, template: any) {
  const suspects = [];
  const defaultNames = ['李助理', '王同事', '陈清洁工', '刘保安'];
  const defaultPersonalities = ['谨慎内向', '野心勃勃', '老实本分', '机警敏锐'];
  const defaultBackgrounds = ['新入职员工', '竞争对手', '长期员工', '外包人员'];
  
  for (let i = 0; i < count; i++) {
    const suspectId = `suspect-${i + 1}`;
    const isCulprit = suspectId === culpritId;
    const profile = template.suspectProfiles[i] || {
      role: `嫌疑人${i + 1}`,
      personality: defaultPersonalities[i] || '普通性格',
      background: defaultBackgrounds[i] || '普通背景'
    };
    
    // 生成不在场证明
    const alibis = [
      '在会议室参加重要会议',
      '在洗手间，有监控可以证明',
      '在其他楼层工作，有同事作证',
      '在外面跑业务，有客户证明',
      '在家休息，有家人作证'
    ];
    
    suspects.push({
      id: suspectId,
      caseId,
      name: defaultNames[i] || `${profile.role}`,
      personality: profile.personality,
      background: profile.background,
      alibi: alibis[i] || '无特殊不在场证明',
      secrets: isCulprit 
        ? [
            '伪造了不在场证明',
            `与${template.victim}有深层矛盾`,
            '掌握作案的关键信息'
          ]
        : [
            `知道${template.victim}的一些秘密`,
            '目击了可疑行为但未报告',
            '与案件有间接关联'
          ],
      isCulprit,
      appearance: {
        avatar: '', // 前端可以根据角色生成头像
        description: generateAppearanceDescription(i, profile.role)
      },
      suspicionLevel: isCulprit 
        ? Math.floor(Math.random() * 3) + 6  // 真凶的可疑度较高但不会太明显
        : Math.floor(Math.random() * 5) + 2, // 其他人的可疑度较低
      emotionalState: isCulprit ? 'nervous' : ['calm', 'nervous', 'defensive'][Math.floor(Math.random() * 3)] as any,
    });
  }
  
  return suspects;
}

/**
 * 生成外貌描述
 * @param index 嫌疑人索引
 * @param role 角色
 * @returns 外貌描述
 */
function generateAppearanceDescription(index: number, role: string): string {
  const descriptions = [
    '年轻女性，戴眼镜，穿着职业装',
    '中年男性，西装革履，表情严肃',
    '年长男性，朴素着装，神情憨厚',
    '壮实男性，制服整齐，目光警觉'
  ];
  
  return descriptions[index] || `${role}，外表普通`;
}

/**
 * 生成初始线索
 * @param caseId 案件ID
 * @param suspects 嫌疑人列表
 * @param difficulty 难度等级
 * @param template 案件模板
 * @returns 线索列表
 */
function generateInitialClues(caseId: string, suspects: any[], difficulty: string, template: any) {
  const clueCount = difficulty === 'easy' ? 3 : difficulty === 'normal' ? 4 : 5;
  const clues = [];
  
  // 根据案件类型生成相应的线索模板
  const clueTemplates = [
    {
      description: `现场发现的指纹与某位嫌疑人匹配`,
      type: 'physical' as const,
      importance: 4,
      isRevealed: true,
    },
    {
      description: `监控录像显示案发时间前后的可疑活动`,
      type: 'digital' as const,
      importance: 5,
      isRevealed: false,
    },
    {
      description: `目击者看到有人在案发现场附近徘徊`,
      type: 'testimony' as const,
      importance: 3,
      isRevealed: true,
    },
    {
      description: `${template.victim}的日程安排显示异常`,
      type: 'circumstantial' as const,
      importance: 2,
      isRevealed: true,
    },
    {
      description: `现场遗留的个人物品`,
      type: 'physical' as const,
      importance: 4,
      isRevealed: false,
    },
    {
      description: `${template.victim}最近的通话记录显示争吵`,
      type: 'digital' as const,
      importance: 3,
      isRevealed: false,
    }
  ];
  
  // 随机选择线索并分配给嫌疑人
  for (let i = 0; i < clueCount; i++) {
    const template_clue = clueTemplates[i];
    const relatedSuspects = [];
    
    // 重要线索更可能指向真凶
    if (template_clue.importance >= 4) {
      const culprit = suspects.find(s => s.isCulprit);
      if (culprit && Math.random() > 0.3) {
        relatedSuspects.push(culprit.id);
      }
    }
    
    // 如果没有指向真凶，随机指向其他嫌疑人
    if (relatedSuspects.length === 0) {
      const randomSuspect = suspects[Math.floor(Math.random() * suspects.length)];
      relatedSuspects.push(randomSuspect.id);
    }
    
    clues.push({
      id: `clue-${i + 1}`,
      caseId,
      description: template_clue.description,
      type: template_clue.type,
      importance: template_clue.importance,
      isRevealed: template_clue.isRevealed,
      relatedSuspects,
    });
  }
  
  return clues;
}